iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0

外覆方法

重構前

假如有個類別Employee, 用來處理支付薪水的函數Pay()

public class Employee
{
    public void Pay()
    {
        Money amount = new Money();
        foreach(var card in timeCards)
        {
            if(payPeriod.Contains(date))
            {
                amount.Add(card.Hours * payRate);
            }
        }

        payDispatcher.Pay(this, date, amount);
    }
}

重構後

需要多一個功能, 用來記錄支付薪資後的log

public class Employee
{
    private void DispatchPayment()
    {
        Money amount = new Money();
        foreach(var card in timeCards)
        {
            if(payPeriod.Contains(date))
            {
                amount.Add(card.Hours * payRate);
            }
        }

        payDispatcher.Pay(this, date, amount);
    }

    public void Pay()
    {
        LogPayment();
        DispatchPayment();
    }

    private void LogPayment()
    {
        //...
    }
}

上述這種改法, 外部人不影響仍是呼叫Pay()函數, 但內部實作已改變.

外覆類別

重構前

與前面的Employee範例一樣:

public class Employee
{
    public void Pay()
    {
        Money amount = new Money();
        foreach(var card in timeCards)
        {
            if(payPeriod.Contains(date))
            {
                amount.Add(card.Hours * payRate);
            }
        }

        payDispatcher.Pay(this, date, amount);
    }
}

重構後

採用裝飾者模式, 繼承Employee類別並實作log功能

public class LoggingEmployee : Employee
{
    public LoggingEmployee(Employee e)
    {
        employee = e;
    }

    public void Pay()
    {
        LogPayment();
        employee.Pay();
    }

    private void LogPayment()
    {
        //...
    }
}

需用到外覆類別的兩種情境

  1. 新增的功能是完全獨立, 不想汙染既有的低層類別
  2. 原始類別已經太巨大而無法大幅改動...

上一篇
新生(Sprout) 方法與類別
下一篇
保持邏輯的局部性
系列文
程式淨化計畫:痛苦是重構的起源!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言